package com.orange.core.pojo.entity.user;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.orange.core.pojo.entity.ICreateModel;
import com.orange.core.pojo.entity.IIntIdModel;
import com.orange.core.pojo.enums.EPayStatus;
import com.orange.core.pojo.enums.ERefundApplyStatus;
import com.orange.core.pojo.enums.ERefundStatus;
import com.orange.core.pojo.enums.EWriteOffStatus;
import lombok.Data;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Data
@Accessors(chain = true)
public class UserCoupon implements IIntIdModel<UserCoupon>, ICreateModel<UserCoupon> {

    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 用户id
     */
    private Integer userId;

    /**
     * 优惠券id
     */
    private Integer couponId;

    /**
     * 商户id
     */
    private Integer shopId;

    /**
     * 订单号
     */
    private String orderNo;

    /**
     * 优惠券标题
     */
    private String title;

    /**
     * 优惠券价值
     */
    private BigDecimal couponValue;

    /**
     * 使用门槛，无门槛传0
     */
    private BigDecimal useThreshold;

    /**
     * 使用门店
     */
    private String shopName;

    /**
     * 使用门店地址
     */
    private String shopAddress;

    /**
     * 门牌号
     */
    @TableField(exist = false)
    private String shopNumber;

    @TableField(exist = false)
    private Integer floorId;

    /**
     * 楼层
     */
    @TableField(exist = false)
    private String floorName;

    /**
     * 优惠券 icon url
     */
    private String iconUrl;

    /**
     * 有效期开始
     */
    private LocalDate effectStart;

    /**
     * 有效期结束
     */
    private LocalDate effectEnd;

    /**
     * 使用须知
     */
    private String usageNote;

    /**
     * 支付状态
     *
     * @see EPayStatus
     */
    private Integer payStatus;

    /**
     * 支付金额
     */
    private BigDecimal paidAmount;

    /**
     * 微信支付订单号
     */
    private String transactionId;

    /**
     * 核销码
     */
    private String writeOffNo;

    /**
     * 核销状态：0待核销，1已核销
     *
     * @see EWriteOffStatus
     */
    private Integer writeOffStatus;

    /**
     * 核销时间
     */
    private LocalDateTime writeOffTime;

    /**
     * 核销人
     */
    private Integer writeOffBy;

    /**
     * 核销人昵称
     */
    @TableField(exist = false)
    private String writeOffByNickname;

    /**
     * 是否过期
     */
    private Boolean isExpired;

    /**
     * 使用时间
     */
    private LocalDateTime useTime;

    /**
     * 退款申请状态：0未申请，1待审核，2审核通过，3审核拒绝，4已取消
     *
     * @see ERefundApplyStatus
     */
    private Integer refundApplyStatus;

    /**
     * 退款申请原因
     */
    private String refundReason;

    /**
     * 退款说明
     */
    private String refundRemark;

    /**
     * 退款申请时间
     */
    private LocalDateTime refundApplyTime;

    // -----------审核人相关字段-------------
    /**
     * 审核人
     */
    private Integer auditBy;

    /**
     * 审核人昵称
     */
    @TableField(exist = false)
    private String auditByNickname;

    /**
     * 审核时间
     */
    private LocalDateTime auditTime;

    /**
     * 审核备注
     */
    private String auditRemark;

    // -----------退款执行相关字段-------------
    /**
     * 退款状态：0未退款，1已退款
     *
     * @see ERefundStatus
     */
    private Integer refundStatus;

    /**
     * 退款时间
     */
    private LocalDateTime refundTime;

    /**
     * 微信退款订单号
     */
    private String refundTransactionId;

    /**
     * 创建时间
     */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime createTime;

    /**
     * 创建人ID
     */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @TableField(fill = FieldFill.INSERT)
    private Integer createBy;

    /**
     * 标签
     */
    @TableField(exist = false)
    private List<String> tags;
}
